This document summmarizes the process and outputs of an analytic
approach taken to increase the Data-WG and broader GEO community
understanding of the relationship between the GEO Data
Sharing (pg 11) and Data
Management Principles (pg. 10) (referred to as DSDMP
hereafter) and other data lifecycle models and reference principles
(referred to as reference frameworks hereafter) that have been
developed since the development of the GEO principles as part of the 2016-2025
GEO Strategic Plan. This document presents both a narrative
description of the process followed in developing the initial
connections between the DSDMP and reference frameworks, and summary
visualizations of the preliminary data.
The work presented herein was initiated in July 2021 within the
Data-WG/DSDMP through a discussion within the subgroup to identify an
initial set of reference frameworks to focus on in the identification of
connections between the DSDMP and those reference frameworks. The
identification of these connections was intended to serve three
purposes:
- Identify gaps in the coverage by DSDMP concepts of elements of the
reference frameworks
- Inform discussions for further development of the DSDMP with
specific insights gained from the process of gap identification
- Enable enhanced communication of the DSDMP to audiences familiar
with the reference frameworks through communication of the identified
connections between the frameworks with which they are familiar and the
DSDMP.
Reference lifecycles and principles were included in the analysis to
both address questions of how the DSDMP relate to the process steps
emphasized in lifecycle models, and the more conceptual elements of the
reference principles. Through addressing both reference lifecycles and
principles we can gain a more holistic assessment of the current
relationship between the DSDMP and the community’s broader practice
informed by values. The initial set of lifecycles and principles
identified by the Data-WG/DSDMP included:
Data Collection
Following the identifcation of the reference frameworks to be used in
the analysis a shared Google
spreadsheet was developed in which the preliminary mappings between
the DSDMP and each of the reference frameworks. The use of the
spreadsheet allowed for rapid prototyping of the data model for
capturing and organizing the developed mappings. The spreadsheet
includes an Instructions worksheet that provides background
information about the content and structure of the spreadsheet, a
Lifecycles worksheet that provides reference information
and labels for each of the selected reference frameworks, a
Crosswalk-DataSharingPrinciples worksheet that provides
reference information about the individual GEO data sharing principles
and the mapping between those principles and the reference frameworks,
and a Crosswalk-DataManagementPrinciples worksheet that
provides reference information about the GEO data management principles
and the mapping between those principles and the reference
frameworks.
The tabular structure within the prototype spreadsheet enables
streamlined extraction of content of descriptive information about the
individual DSDMT and reference frameworks and the identified connections
between them.
Analysis
The extraction of data managed in the prototype spreadsheet is
accomplished through R code (in the form of the R markdown document used
to create this document and other analytic products) that:
- Reads the content of the individual data containing worksheets
Lifecycles
Crosswalk-DataSharingPrinciples
Crosswalk-DataManagementPrinciples
- Extracts and formats the data from each worksheet
- Presents the extracted connection information in tabular form
- Visualizes the connection information for graphic
interpretation
- Presents the reference information about the DSDMP and reference
frameworks
Next Steps
While the current spreadsheet provides a useful initial platform for
capturing and sharing the initial mappings, it does not provide a
scalable data structure that will enable streamlined collection of data
from multiple contributors, allowing for cross-validation of identified
connections. Next steps for work on this project include the
following:
- Transitioning to a data model that will enable capture and
management of connection information from multiple contributors -
enabling cross validation of identified connections.
- Expansion of the data model to capture information about the nature
of the connections
- Develop an online dashboard that provides current connection
information based upon community contributed data
- Publish the results of the analysis in one or more Earth Science
data publication venues
LS0tCnRpdGxlOiAiTGlua2luZyB0aGUgR0VPIERhdGEgU2hhcmluZyBhbmQgRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgdG8gb3RoZXIgUmVmZXJlbmNlIExpZmVjeWNsZXMgYW5kIFByaW5jaXBsZXMiCmF1dGhvcjogIkthcmwgQmVuZWRpY3QiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVZLSViLSVkJylgIgpvdXRwdXQ6CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgbG9hZCByZXF1aXJlZCBsaWJyYXJpZXMKbGlicmFyeShnb29nbGVzaGVldHM0KQpsaWJyYXJ5KGdvb2dsZWRyaXZlKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShpZ3JhcGgpCmxpYnJhcnkoZ2dyYXBoKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZmxleHRhYmxlKQoKb3B0cyA8LSBvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gIiIpCmBgYAoKfCAqKkdFTyBXb3JraW5nIEdyb3VwKio6IFtEYXRhIFdvcmtpbmcgR3JvdXAgKERhdGEtV0cpXShodHRwczovL3d3dy5lYXJ0aG9ic2VydmF0aW9ucy5vcmcvZGF0YV93Zy5waHApCnwgKipTdWJncm91cCoqOiAqRGF0YSBTaGFyaW5nIGFuZCBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyogKERhdGEtV0cvRFNETVApCgpUaGlzIGRvY3VtZW50IHN1bW1tYXJpemVzIHRoZSBwcm9jZXNzIGFuZCBvdXRwdXRzIG9mIGFuIGFuYWx5dGljIGFwcHJvYWNoIHRha2VuIHRvIGluY3JlYXNlIHRoZSBEYXRhLVdHIGFuZCBicm9hZGVyIEdFTyBjb21tdW5pdHkgdW5kZXJzdGFuZGluZyBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIEdFTyBbRGF0YSBTaGFyaW5nIChwZyAxMSldKGh0dHBzOi8vd3d3LmVhcnRob2JzZXJ2YXRpb25zLm9yZy9kb2N1bWVudHMvb3Blbl9lb19kYXRhL0dFT19TdHJhdGVnaWNfUGxhbl8yMDE2XzIwMjVfSW1wbGVtZW50aW5nX0dFT1NTX1JlZmVyZW5jZV9Eb2N1bWVudC5wZGYpIGFuZCBbRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgKHBnLiAxMCldKGh0dHBzOi8vd3d3LmVhcnRob2JzZXJ2YXRpb25zLm9yZy9kb2N1bWVudHMvb3Blbl9lb19kYXRhL0dFT19TdHJhdGVnaWNfUGxhbl8yMDE2XzIwMjVfSW1wbGVtZW50aW5nX0dFT1NTX1JlZmVyZW5jZV9Eb2N1bWVudC5wZGYpIChyZWZlcnJlZCB0byBhcyAqRFNETVAqIGhlcmVhZnRlcikgYW5kIG90aGVyIGRhdGEgbGlmZWN5Y2xlIG1vZGVscyBhbmQgcmVmZXJlbmNlIHByaW5jaXBsZXMgKHJlZmVycmVkIHRvIGFzICpyZWZlcmVuY2UgZnJhbWV3b3JrcyogaGVyZWFmdGVyKSB0aGF0IGhhdmUgYmVlbiBkZXZlbG9wZWQgc2luY2UgdGhlIGRldmVsb3BtZW50IG9mIHRoZSBHRU8gcHJpbmNpcGxlcyBhcyBwYXJ0IG9mIHRoZSBbMjAxNi0yMDI1IEdFTyBTdHJhdGVnaWMgUGxhbl0oaHR0cHM6Ly93d3cuZWFydGhvYnNlcnZhdGlvbnMub3JnL2RvY3VtZW50cy9vcGVuX2VvX2RhdGEvR0VPX1N0cmF0ZWdpY19QbGFuXzIwMTZfMjAyNV9JbXBsZW1lbnRpbmdfR0VPU1MucGRmKS4gVGhpcyBkb2N1bWVudCBwcmVzZW50cyBib3RoIGEgbmFycmF0aXZlIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9jZXNzIGZvbGxvd2VkIGluIGRldmVsb3BpbmcgdGhlIGluaXRpYWwgY29ubmVjdGlvbnMgYmV0d2VlbiB0aGUgRFNETVAgYW5kIHJlZmVyZW5jZSBmcmFtZXdvcmtzLCBhbmQgc3VtbWFyeSB2aXN1YWxpemF0aW9ucyBvZiB0aGUgcHJlbGltaW5hcnkgZGF0YS4gCgpUaGUgd29yayBwcmVzZW50ZWQgaGVyZWluIHdhcyBpbml0aWF0ZWQgaW4gSnVseSAyMDIxIHdpdGhpbiB0aGUgRGF0YS1XRy9EU0RNUCB0aHJvdWdoIGEgZGlzY3Vzc2lvbiB3aXRoaW4gdGhlIHN1Ymdyb3VwIHRvIGlkZW50aWZ5IGFuIGluaXRpYWwgc2V0IG9mIHJlZmVyZW5jZSBmcmFtZXdvcmtzIHRvIGZvY3VzIG9uIGluIHRoZSBpZGVudGlmaWNhdGlvbiBvZiBjb25uZWN0aW9ucyBiZXR3ZWVuIHRoZSBEU0RNUCBhbmQgdGhvc2UgcmVmZXJlbmNlIGZyYW1ld29ya3MuIFRoZSBpZGVudGlmaWNhdGlvbiBvZiB0aGVzZSBjb25uZWN0aW9ucyB3YXMgaW50ZW5kZWQgdG8gc2VydmUgdGhyZWUgcHVycG9zZXM6CgoqIElkZW50aWZ5IGdhcHMgaW4gdGhlIGNvdmVyYWdlIGJ5IERTRE1QIGNvbmNlcHRzIG9mIGVsZW1lbnRzIG9mIHRoZSByZWZlcmVuY2UgZnJhbWV3b3JrcwoqIEluZm9ybSBkaXNjdXNzaW9ucyBmb3IgZnVydGhlciBkZXZlbG9wbWVudCBvZiB0aGUgRFNETVAgd2l0aCBzcGVjaWZpYyBpbnNpZ2h0cyBnYWluZWQgZnJvbSB0aGUgcHJvY2VzcyBvZiBnYXAgaWRlbnRpZmljYXRpb24KKiBFbmFibGUgZW5oYW5jZWQgY29tbXVuaWNhdGlvbiBvZiB0aGUgRFNETVAgdG8gYXVkaWVuY2VzIGZhbWlsaWFyIHdpdGggdGhlIHJlZmVyZW5jZSBmcmFtZXdvcmtzIHRocm91Z2ggY29tbXVuaWNhdGlvbiBvZiB0aGUgaWRlbnRpZmllZCBjb25uZWN0aW9ucyBiZXR3ZWVuIHRoZSBmcmFtZXdvcmtzIHdpdGggd2hpY2ggdGhleSBhcmUgZmFtaWxpYXIgYW5kIHRoZSBEU0RNUC4gCgpSZWZlcmVuY2UgbGlmZWN5Y2xlcyBhbmQgcHJpbmNpcGxlcyB3ZXJlIGluY2x1ZGVkIGluIHRoZSBhbmFseXNpcyB0byBib3RoIGFkZHJlc3MgcXVlc3Rpb25zIG9mIGhvdyB0aGUgRFNETVAgcmVsYXRlIHRvIHRoZSBwcm9jZXNzIHN0ZXBzIGVtcGhhc2l6ZWQgaW4gbGlmZWN5Y2xlIG1vZGVscywgYW5kIHRoZSBtb3JlIGNvbmNlcHR1YWwgZWxlbWVudHMgb2YgdGhlIHJlZmVyZW5jZSBwcmluY2lwbGVzLiBUaHJvdWdoIGFkZHJlc3NpbmcgYm90aCByZWZlcmVuY2UgbGlmZWN5Y2xlcyBhbmQgcHJpbmNpcGxlcyB3ZSBjYW4gZ2FpbiBhIG1vcmUgaG9saXN0aWMgYXNzZXNzbWVudCBvZiB0aGUgY3VycmVudCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgRFNETVAgYW5kIHRoZSBjb21tdW5pdHkncyBicm9hZGVyIHByYWN0aWNlIGluZm9ybWVkIGJ5IHZhbHVlcy4gVGhlIGluaXRpYWwgc2V0IG9mIGxpZmVjeWNsZXMgYW5kIHByaW5jaXBsZXMgaWRlbnRpZmllZCBieSB0aGUgRGF0YS1XRy9EU0RNUCBpbmNsdWRlZDoKCiogW05PQUEgRW52aXJvbm1lbnRhbCBEYXRhIE1hbmFnZW1lbnQgRnJhbWV3b3JrXShodHRwczovL25vc2Mubm9hYS5nb3YvRURNQy9mcmFtZXdvcmsucGhwKSAoRURNRiAtIG5vdCB5ZXQgY29tcGxldGVkKQoqIFtVUyBOYXRpb25hbCBTY2llbmNlIGFuZCBUZWNobm9sb2d5IENvdW5jaWwgQ29tbW9uIEZyYW1ld29yayBmb3IgRU8gRGF0YV0oaHR0cHM6Ly91c2dlby5nb3YvdXBsb2Fkcy9jb21tb25fZnJhbWV3b3JrX2Zvcl9lYXJ0aF9vYnNlcnZhdGlvbl9kYXRhLnBkZikgKE5TVEMgLSBwcmVsaW1pbmFyeSBjb25uZWN0aW9ucyBkZWZpbmVkKQoqIFtFdXJvcGVhbiBFbnZpcm9ubWVudCBBZ2VuY3kgRGF0YS9JbmZvcm1hdGlvbiBNYW5hZ2VtZW50IEZyYW1ld29ya10oaHR0cHM6Ly9lbmktc2Vpcy5laW9uZXQuZXVyb3BhLmV1L2Vhc3QvZ292ZXJuYW5jZS9wcm9qZWN0LWRvY3VtZW50cy9lZWEtZGF0YS1pbmZvcm1hdGlvbi1tYW5hZ2VtZW50LWZyYW1ld29yaykKIChFRUEgLSBwcmVsaW1pbmFyeSBjb25uZWN0aW9ucyBkZWZpbmVkKQogKiBbKFVTKSBOYXRpb25hbCBJbnN0aXR1dGUgZm9yIFN0YW5kYXJkcyBhbmQgVGVjaG5vbG9neSBSZXNlYXJjaCBEYXRhIEZyYW1ld29ya10oaHR0cHM6Ly93d3cubmlzdC5nb3Yvc3lzdGVtL2ZpbGVzL2RvY3VtZW50cy8yMDIxLzAxLzI5L1JEYUYlMjBPdmVydmV3JTIwSGFuaXNjaC5wZGYpIChOSVNUIC0gcHJlbGltaW5hcnkgY29ubmVjdGlvbnMgZGVmaW5lZCkKICogW0RhdGFPTkUgRGF0YSBMaWZlY3ljbGVdKGh0dHBzOi8vb2xkLmRhdGFvbmUub3JnL2RhdGEtbGlmZS1jeWNsZSkgKERhdGFPTkUgLSBwcmVsaW1pbmFyeSBjb25uZWN0aW9ucyBkZWZpbmVkKQogKiBbRkFJUiBQcmluY2lwbGVzXShodHRwczovL3d3dy5uYXR1cmUuY29tL2FydGljbGVzL3NkYXRhMjAxNjE4KSAoRkFJUiAtIHByZWxpbWluYXJ5IGNvbm5lY3Rpb25zIGRlZmluZWQpCiAqIFtUUlVTVCBQcmluY2lwbGVzXShodHRwczovL3d3dy5uYXR1cmUuY29tL2FydGljbGVzL3M0MTU5Ny0wMjAtMDQ4Ni03KSAoVFJVU1QgLSBwcmVsaW1pbmFyeSBjb25uZWN0aW9ucyBkZWZpbmVkKQogKiBDQVJFIFByaW5jaXBsZXMgKENBUkUgLSBub3QgeWV0IGNvbXBsZXRlZCkKCgojIyBEYXRhIENvbGxlY3Rpb24KCkZvbGxvd2luZyB0aGUgaWRlbnRpZmNhdGlvbiBvZiB0aGUgcmVmZXJlbmNlIGZyYW1ld29ya3MgdG8gYmUgdXNlZCBpbiB0aGUgYW5hbHlzaXMgYSBzaGFyZWQgW0dvb2dsZSBzcHJlYWRzaGVldF0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMTVGbXcwbTJqeC13S05xeXpCOUFzUmJEZW9rcDlOb3dyWkJkN1hMSFpURWMvZWRpdCNnaWQ9MTcxOTk0OTY0MSkgd2FzIGRldmVsb3BlZCBpbiB3aGljaCB0aGUgcHJlbGltaW5hcnkgbWFwcGluZ3MgYmV0d2VlbiB0aGUgRFNETVAgYW5kIGVhY2ggb2YgdGhlIHJlZmVyZW5jZSBmcmFtZXdvcmtzLiBUaGUgdXNlIG9mIHRoZSBzcHJlYWRzaGVldCBhbGxvd2VkIGZvciByYXBpZCBwcm90b3R5cGluZyBvZiB0aGUgZGF0YSBtb2RlbCBmb3IgY2FwdHVyaW5nIGFuZCBvcmdhbml6aW5nIHRoZSBkZXZlbG9wZWQgbWFwcGluZ3MuIFRoZSBzcHJlYWRzaGVldCBpbmNsdWRlcyBhbiBgSW5zdHJ1Y3Rpb25zYCB3b3Jrc2hlZXQgdGhhdCBwcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250ZW50IGFuZCBzdHJ1Y3R1cmUgb2YgdGhlIHNwcmVhZHNoZWV0LCBhIGBMaWZlY3ljbGVzYCB3b3Jrc2hlZXQgdGhhdCBwcm92aWRlcyByZWZlcmVuY2UgaW5mb3JtYXRpb24gYW5kIGxhYmVscyBmb3IgZWFjaCBvZiB0aGUgc2VsZWN0ZWQgcmVmZXJlbmNlIGZyYW1ld29ya3MsIGEgYENyb3Nzd2Fsay1EYXRhU2hhcmluZ1ByaW5jaXBsZXNgIHdvcmtzaGVldCB0aGF0IHByb3ZpZGVzIHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5kaXZpZHVhbCBHRU8gZGF0YSBzaGFyaW5nIHByaW5jaXBsZXMgYW5kIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhvc2UgcHJpbmNpcGxlcyBhbmQgdGhlIHJlZmVyZW5jZSBmcmFtZXdvcmtzLCBhbmQgYSBgQ3Jvc3N3YWxrLURhdGFNYW5hZ2VtZW50UHJpbmNpcGxlc2Agd29ya3NoZWV0IHRoYXQgcHJvdmlkZXMgcmVmZXJlbmNlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBHRU8gZGF0YSBtYW5hZ2VtZW50IHByaW5jaXBsZXMgYW5kIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhvc2UgcHJpbmNpcGxlcyBhbmQgdGhlIHJlZmVyZW5jZSBmcmFtZXdvcmtzLiAKClRoZSB0YWJ1bGFyIHN0cnVjdHVyZSB3aXRoaW4gdGhlIHByb3RvdHlwZSBzcHJlYWRzaGVldCBlbmFibGVzIHN0cmVhbWxpbmVkIGV4dHJhY3Rpb24gb2YgY29udGVudCBvZiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5kaXZpZHVhbCBEU0RNVCBhbmQgcmVmZXJlbmNlIGZyYW1ld29ya3MgYW5kIHRoZSBpZGVudGlmaWVkIGNvbm5lY3Rpb25zIGJldHdlZW4gdGhlbS4gCgojIyBBbmFseXNpcwoKVGhlIGV4dHJhY3Rpb24gb2YgZGF0YSBtYW5hZ2VkIGluIHRoZSBwcm90b3R5cGUgc3ByZWFkc2hlZXQgaXMgYWNjb21wbGlzaGVkIHRocm91Z2ggUiBjb2RlIChpbiB0aGUgZm9ybSBvZiB0aGUgUiBtYXJrZG93biBkb2N1bWVudCB1c2VkIHRvIGNyZWF0ZSB0aGlzIGRvY3VtZW50IGFuZCBvdGhlciBhbmFseXRpYyBwcm9kdWN0cykgdGhhdDoKCiogUmVhZHMgdGhlIGNvbnRlbnQgb2YgdGhlIGluZGl2aWR1YWwgZGF0YSBjb250YWluaW5nIHdvcmtzaGVldHMKICAqIGBMaWZlY3ljbGVzYAogICogYENyb3Nzd2Fsay1EYXRhU2hhcmluZ1ByaW5jaXBsZXNgCiAgKiBgQ3Jvc3N3YWxrLURhdGFNYW5hZ2VtZW50UHJpbmNpcGxlc2AKKiBFeHRyYWN0cyBhbmQgZm9ybWF0cyB0aGUgZGF0YSBmcm9tIGVhY2ggd29ya3NoZWV0CiogUHJlc2VudHMgdGhlIGV4dHJhY3RlZCBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGluIHRhYnVsYXIgZm9ybQoqIFZpc3VhbGl6ZXMgdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gZm9yIGdyYXBoaWMgaW50ZXJwcmV0YXRpb24KKiBQcmVzZW50cyB0aGUgcmVmZXJlbmNlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBEU0RNUCBhbmQgcmVmZXJlbmNlIGZyYW1ld29ya3MKCgpgYGB7ciwgZWNobz1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0iaGlkZSJ9CiMgQ3Jvc3N3YWxrIGJldHdlZW4gR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIGFuZCBzZWxlY3RlZCBsaWZlY3ljbGVzIGFuZCBwcmluY2lwbGVzCmdzaGVldFVSTCA8LSAiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMTVGbXcwbTJqeC13S05xeXpCOUFzUmJEZW9rcDlOb3dyWkJkN1hMSFpURWMvZWRpdCNnaWQ9MTcxOTk0OTY0MSIKZ3NoZWV0U2hhcmluZ1dvcmtzaGVldCA8LSAiQ3Jvc3N3YWxrLURhdGFTaGFyaW5nUHJpbmNpcGxlcyIKZ3NoZWV0TWFuYWdlbWVudFdvcmtzaGVldCA8LSAiQ3Jvc3N3YWxrLURhdGFNYW5hZ2VtZW50UHJpbmNpcGxlcyIKCmdzNF9kZWF1dGgoKSAjIGRpc2FibGUgYXV0aGVudGljYXRpb24gcmVxdWlyZW1lbnRzIGZvciB0aGlzIHB1YmxpYyBzaGVldAoKIyBnZXQgdGhlIHNoZWV0IGlkcyBmcm9tIHRoZSBnb29nbGUgc2hlZXQgdXJsCnNzaWQgPC0gYXNfc2hlZXRzX2lkKGdzaGVldFVSTCkKdW5jbGFzcyhzc2lkKQoKIyByZXRyaWV2ZSB0aGUgYmFzZSBzaGVldCBjb250ZW50CmxpZmVjeWNsZXMgPC0gcmVhZF9zaGVldChzc2lkLCBzaGVldCA9ICJMaWZlY3ljbGVzIiwgc2tpcCA9IDEsIG5hID0gYygiLSIsICIiKSkKZG1wX2Nyb3Nzd2FsayA8LSByZWFkX3NoZWV0KHNzaWQsIHNoZWV0ID0gIkNyb3Nzd2Fsay1EYXRhTWFuYWdlbWVudFByaW5jaXBsZXMiKQpkc3BfY3Jvc3N3YWxrIDwtIHJlYWRfc2hlZXQoc3NpZCwgc2hlZXQgPSAiQ3Jvc3N3YWxrLURhdGFTaGFyaW5nUHJpbmNpcGxlcyIpCgojIGV4dHJhY3Qgbm9kZXMgCm5fbGlmZWN5Y2xlcyA8LSBsaWZlY3ljbGVzICU+JSAKICBzZWxlY3QobWF0Y2hlcygiLWNvbWJvJCIpKSAlPiUgCiAgZ2F0aGVyKCkgJT4lIAogIGZpbHRlcighaXMubmEodmFsdWUpKSAlPiUgCiAgZGlzdGluY3QodmFsdWUpICU+JSAKICBtdXRhdGUobGFiZWwgPSBzdHJfc3BsaXQodmFsdWUsICItIiwgc2ltcGxpZnkgPSBGQUxTRSwgbiA9IDMpKSAlPiUgCiAgc2VsZWN0KGxhYmVsKQoKbl9kbXAgPC0gZG1wX2Nyb3Nzd2FsayAlPiUgCiAgZmlsdGVyKCFpcy5uYShEYXRhTWFuYWdlbWVudFByaW5jaXBsZSkpICU+JSAKICBkaXN0aW5jdChEYXRhTWFuYWdlbWVudFByaW5jaXBsZSkgJT4lIAogIG11dGF0ZShsYWJlbCA9IERhdGFNYW5hZ2VtZW50UHJpbmNpcGxlKSAlPiUgCiAgc2VsZWN0KGxhYmVsKQoKbl9hbGwgPC0gbl9saWZlY3ljbGVzICU+JSAKICByb3d3aXNlKCkgJT4lIAogIG11dGF0ZSh0eXBlID0gY2FzZV93aGVuKGxhYmVsWzFdID09ICJUUlVTVCIgfiAicHJpbmNpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFsxXSA9PSAiRkFJUiIgfiAicHJpbmNpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFsxXSA9PSAiRGF0YU9ORSIgfiAibGlmZWN5Y2xlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFsxXSA9PSAiTklTVCIgfiAibGlmZWN5Y2xlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFsxXSA9PSAiRUVBIiB+ICJsaWZlY3ljbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsWzFdID09ICJEYXRhT05FIiB+ICJsaWZlY3ljbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsWzFdID09ICJOU1RDIiB+ICJsaWZlY3ljbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsWzFdID09ICJEYXRhT05FIiB+ICJsaWZlY3ljbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsWzFdID09ICJFRE1GIiB+ICJsaWZlY3ljbGUiKSkgJT4lIAogIG11dGF0ZSgKICAgIGtleSA9IHBhc3RlKGxhYmVsWzFdLCBsYWJlbFsyXSwgc2VwID0gIi0iKSwgCiAgICBzb3VyY2UgPSBsYWJlbFsxXSwKICAgIHNob3J0X2xhYmVsID0ga2V5LCAKICAgIGxhYmVsID0gcGFzdGUocGFzdGUobGFiZWxbMV0sIGxhYmVsWzJdLCBzZXAgPSAiLSIpLCBsYWJlbFszXSwgc2VwID0gIjogIiksCiAgICBub2RlX2xhYmVsID0gbGFiZWwpICU+JSAKICByYmluZChtdXRhdGUobl9kbXAsCiAgICAgICAgICAgICAgIGtleSA9IHNhcHBseShzdHJzcGxpdChsYWJlbCwgIjoiKSwgIltbIiwgMSksCiAgICAgICAgICAgICAgIHNob3J0X2xhYmVsID0ga2V5LCAKICAgICAgICAgICAgICAgbm9kZV9sYWJlbCA9IGxhYmVsLCAKICAgICAgICAgICAgICAgdHlwZSA9ICJHRU8tUHJpbmNpcGxlIiwKICAgICAgICAgICAgICAgc291cmNlID0gIkdFTyIpKSAlPiUgCiAgc2VsZWN0KGtleSwgc2hvcnRfbGFiZWwsIG5vZGVfbGFiZWwsIHNvdXJjZSwgdHlwZSkKICAKCmVfZG1wX2xpZmVjeWNsZSA8LSB0aWJibGUoImZyb20iID0gY2hhcmFjdGVyKCksICJ0byIgPSBjaGFyYWN0ZXIoKSkKZG1wX2Zyb20gPC0gZG1wX2Nyb3Nzd2FsayREYXRhTWFuYWdlbWVudFByaW5jaXBsZQpkbXBfdG8gPC0gZG1wX2Nyb3Nzd2FsayAlPiUgc2VsZWN0KC1EYXRhTWFuYWdlbWVudFByaW5jaXBsZSwgLVByaW5jaXBsZURlc2NyaXB0aW9uKQoKZm9yIChpIGluIHNlcV9hbG9uZyhkbXBfdG8pKSB7CiAgb3V0X3RvIDwtIGRtcF90b1tbaV1dCiAgb3V0X2NvbWJpbmVkIDwtIGJpbmRfY29scyhkbXBfZnJvbSwgb3V0X3RvKQogIGVfZG1wX2xpZmVjeWNsZSA8LSByYmluZChlX2RtcF9saWZlY3ljbGUsb3V0X2NvbWJpbmVkKQp9CgplX2RtcF9saWZlY3ljbGUgPC0gZV9kbXBfbGlmZWN5Y2xlICU+JSAKICByZW5hbWUoZnJvbSA9IDEsIHRvID0gMikgJT4lIAogIGZpbHRlcighaXMubmEodG8pKSAlPiUgCiAgbXV0YXRlKGxpZmVjeWNsZSA9IHN0cl9zcGxpdCh0bywgIi0iLCBzaW1wbGlmeSA9IFRSVUUpLAogICAgICAgICBmcm9tID0gc2FwcGx5KHN0cnNwbGl0KGZyb20sICI6IiksICJbWyIsIDEpLCkKCm5fZG1wX2xpZmVjeWNsZSA8LSBlX2RtcF9saWZlY3ljbGUgJT4lIAogIHNlbGVjdChmcm9tLCB0bykgJT4lIAogIGdhdGhlcigpICU+JSAKICBzZWxlY3QodmFsdWUpICU+JSAKICBkaXN0aW5jdCh2YWx1ZSkKCmBgYAoKIyMjIERldmVsb3BlZCBDcm9zc3dhbGsgSW5mb3JtYXRpb24KClRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgY29ubmVjdGlvbnMgZGVmaW5lZCB0aHVzIGZhciBiZXR3ZWVuIHRoZSBHRU8gRFNETVAgYW5kIHRoZSByZWZlcmVuY2UgZnJhbWV3b3Jrcy4gCgpgYGB7ciwgZWNobz1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KZG1wX2Nyb3Nzd2Fsa1tjKDEsNCw1LDYsNyw4LDkpXSAlPiUgCiAgcWZsZXh0YWJsZSgpICU+JSAKICBzZXRfaGVhZGVyX2xhYmVscygKICAgIHZhbHVlcyA9IGxpc3QoRGF0YU1hbmFnZW1lbnRQcmluY2lwbGUgPSAiRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZSIsCiAgICAgICAgICAgICAgICAgICJMaWZlY3ljbGUtRURNRiIgPSAiRURNRiIsCiAgICAgICAgICAgICAgICAgICJMaWZlY3ljbGUtTlNUQyIgPSAiTlNUQyIsCiAgICAgICAgICAgICAgICAgICJMaWZlY3ljbGUtRUVBIiA9ICJFRUEiLAogICAgICAgICAgICAgICAgICAiTGlmZWN5Y2xlLU5JU1QiID0gIk5JU1QiLAogICAgICAgICAgICAgICAgICAiTGlmZWN5Y2xlLURhdGFPTkUiID0gIkRhdGFPTkUiLAogICAgICAgICAgICAgICAgICAiUHJpbmNpcGxlLUZBSVIiID0gIkZBSVIiLAogICAgICAgICAgICAgICAgICAiUHJpbmNpcGxlLVRSVVNUIiA9ICJUUlVTVCIpKSAlPiUgCiAgZm9udHNpemUoc2l6ZSA9IDcsIHBhcnQgPSAiYm9keSIpICU+JSAKICBmaXRfdG9fd2lkdGgobWF4X3dpZHRoID0gNi41LCB1bml0ID0gImluIikKYGBgCiMjIFZpc3VhbGl6ZSBzb21lIHJlbGF0aW9uc2hpcHMKCmBgYHtyLCBlY2hvPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQojIGNpcmN1bGFyIHBsb3QgMXgxIGZ1bmNpdG9uCmdlb194X3NpbmdsZSA8LSBmdW5jdGlvbih0aXRsZSwgdG9fbm9kZXMsIG91dHB1dF9maWxlKSB7CiAgZWRnZXMgPC0gZmlsdGVyKGVfZG1wX2xpZmVjeWNsZSwgbGlmZWN5Y2xlWywxXSA9PSB0b19ub2RlcykKICAjcHJpbnQoZWRnZXMpCiAgdmVydGljZXMgPC0gZmlsdGVyKG5fYWxsLCAoc291cmNlID09IHRvX25vZGVzIHwgc291cmNlID09ICJHRU8iKSkKICAjcHJpbnQodmVydGljZXMpCiAgZ3JhcGggPC0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKAogICAgZCA9IGVkZ2VzLAogICAgdmVydGljZXMgPSB2ZXJ0aWNlcywKICAgIGRpcmVjdGVkID0gVFJVRSkKICB4eSA8LSBsYXlvdXRfKGdyYXBoLGluX2NpcmNsZSgpKQogIGNpcmN1bGFyX3Bsb3QgPC0gZ2dyYXBoKGdyYXBoLCBsYXlvdXQgPSAibGluZWFyIiwgY2lyY3VsYXIgPSBUUlVFKSArCiAgICBjb29yZF9maXhlZCgpICsKICAgIGdlb21fZWRnZV9saW5rMCh3aWR0aCA9IC4xKSArCiAgICBnZW9tX25vZGVfcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHNvdXJjZSkpLCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogICAgZ2VvbV9ub2RlX2xhYmVsKGFlcyhsYWJlbCA9IHNob3J0X2xhYmVsLCAKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBhcy5mYWN0b3Ioc291cmNlKSksIAogICAgICAgICAgICAgICAgICAgIGxhYmVsLnNpemUgPSAwLAogICAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAgIHhsaW0oLTEuMSwgMS4xKSArCiAgICB5bGltKC0xLjEsIDEuMSkgKwogICAgZ2d0aXRsZSh0aXRsZSkgKwogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpCiAgZ2dzYXZlKHBhc3RlKCJpbWFnZXMvY2lyY3VsYXJfIiwgb3V0cHV0X2ZpbGUsIHNlcCA9ICIiKSwgcGxvdCA9IGNpcmN1bGFyX3Bsb3QsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSwgZHBpID0gNjAwKQogIAogICBkZWZhdWx0X3Bsb3QgPC0gZ2dyYXBoKGdyYXBoKSArCiAgICBnZW9tX2VkZ2VfbGluazAod2lkdGggPSAuMSkgKwogICAgZ2VvbV9ub2RlX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3Rvcihzb3VyY2UpKSwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAgIGdlb21fbm9kZV9sYWJlbChhZXMobGFiZWwgPSBzaG9ydF9sYWJlbCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYXMuZmFjdG9yKHNvdXJjZSkpLCAKICAgICAgICAgICAgICAgICAgICBsYWJlbC5zaXplID0gMCwKICAgICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgICBnZ3RpdGxlKHRpdGxlKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkKICBnZ3NhdmUocGFzdGUoImltYWdlcy9hdXRvXyIsIG91dHB1dF9maWxlLCBzZXAgPSAiIiksIHBsb3QgPSBkZWZhdWx0X3Bsb3QsIHdpZHRoID0xMiwgaGVpZ2h0ID0xMiwgZHBpID0gNjAwKQogIAogICNmaWd1cmVzIDwtIGMocGFzdGUoIi4vaW1hZ2VzL2NpcmN1bGFyXyIsIG91dHB1dF9maWxlLCBzZXAgPSAiIiksIHBhc3RlKCIuL2ltYWdlcy9hdXRvXyIsIG91dHB1dF9maWxlLCBzZXAgPSAiIikpCiAgI3JldHVybihmaWd1cmVzKQp9CmBgYAoKR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORQoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cmdlb194X3NpbmdsZSgKICAiR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIE1hcHBlZCB0byBEYXRhT05FIExpZmVjeWNsZSBFbGVtZW50cyIsCiAgIkRhdGFPTkUiLCAKICAiZGF0YW9uZS5wbmciKQpgYGAKCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORV0oaW1hZ2VzL2NpcmN1bGFyX2RhdGFvbmUucG5nKQohW0dFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyAtIERhdGFPTkVdKGltYWdlcy9hdXRvX2RhdGFvbmUucG5nKQpcbmV3cGFnZQpHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgLSBOU1RDCgpgYGB7ciwgZWNobz1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KZ2VvX3hfc2luZ2xlKAogICJHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgTWFwcGVkIHRvIE5TVEMgTGlmZWN5Y2xlIEVsZW1lbnRzIiwKICAiTlNUQyIsIAogICJuc3RjLnBuZyIpCmBgYAoKIVtHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgLSBEYXRhT05FXShpbWFnZXMvY2lyY3VsYXJfbnN0Yy5wbmcpCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORV0oaW1hZ2VzL2F1dG9fbnN0Yy5wbmcpClxuZXdwYWdlCkdFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyAtIEVFQQoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cmdlb194X3NpbmdsZSgKICAiR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIE1hcHBlZCB0byBFRUEgTGlmZWN5Y2xlIEVsZW1lbnRzIiwKICAiRUVBIiwgCiAgImVlYS5wbmciKQpgYGAKCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORV0oaW1hZ2VzL2NpcmN1bGFyX2VlYS5wbmcpCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORV0oaW1hZ2VzL2F1dG9fZWVhLnBuZykKXG5ld3BhZ2UKR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gTklTVAoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cmdlb194X3NpbmdsZSgKICAiR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIE1hcHBlZCB0byBOSVNUIExpZmVjeWNsZSBFbGVtZW50cyIsCiAgIk5JU1QiLCAKICAibmlzdC5wbmciKQpgYGAKCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORV0oaW1hZ2VzL2NpcmN1bGFyX25pc3QucG5nKQohW0dFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyAtIERhdGFPTkVdKGltYWdlcy9hdXRvX25pc3QucG5nKQpcbmV3cGFnZQpHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgLSBGQUlSCgpgYGB7ciwgZWNobz1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KZ2VvX3hfc2luZ2xlKAogICJHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgTWFwcGVkIHRvIEZBSVIgUHJpbmNpcGxlcyBFbGVtZW50cyIsCiAgIkZBSVIiLCAKICAiZmFpci5wbmciKQpgYGAKCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORV0oaW1hZ2VzL2NpcmN1bGFyX2ZhaXIucG5nKQohW0dFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyAtIERhdGFPTkVdKGltYWdlcy9hdXRvX2ZhaXIucG5nKQpcbmV3cGFnZQpHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgLSBUUlVTVAoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cmdlb194X3NpbmdsZSgKICAiR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIE1hcHBlZCB0byBUUlVTVCBQcmluY2lwbGVzIEVsZW1lbnRzIiwKICAiVFJVU1QiLCAKICAidHJ1c3QucG5nIikKYGBgCgohW0dFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyAtIERhdGFPTkVdKGltYWdlcy9jaXJjdWxhcl90cnVzdC5wbmcpCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORV0oaW1hZ2VzL2F1dG9fdHJ1c3QucG5nKQpcbmV3cGFnZQpHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgLSBSZWZlcmVuY2UgRnJhbWV3b3JrcwoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMgY29tYmluZWQgZ3JhcGggZm9yIGFsbCBwcmluY2lwbGVzCmdyYXBoIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZSgKICAgIGQgPSBmaWx0ZXIoZV9kbXBfbGlmZWN5Y2xlLCAobGlmZWN5Y2xlID09ICJGQUlSIiB8IGxpZmVjeWNsZSA9PSAiVFJVU1QiKSApLAogICAgdmVydGljZXMgPSBmaWx0ZXIobl9hbGwsIChzb3VyY2UgPT0gIkZBSVIiIHwgc291cmNlID09ICJUUlVTVCIgfCBzb3VyY2UgPT0gIkdFTyIpICksCiAgICBkaXJlY3RlZCA9IEZBTFNFKQogIHh5IDwtIGxheW91dF8oZ3JhcGgsaW5fY2lyY2xlKCkpCiAgZ2dyYXBoKGdyYXBoLCBsYXlvdXQgPSAibGluZWFyIiwgY2lyY3VsYXIgPSBUUlVFKSArCiAgICBjb29yZF9maXhlZCgpICsKICAgIGdlb21fZWRnZV9saW5rMChhZXMoY29sb3IgPSBsaWZlY3ljbGUpLCB3aWR0aCA9IDEpICsKICAgIGdlb21fbm9kZV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3Ioc291cmNlKSksIHNpemUgPSAxLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgICBnZW9tX25vZGVfbGFiZWwoYWVzKGxhYmVsID0gc2hvcnRfbGFiZWwsIAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGFzLmZhY3Rvcihzb3VyY2UpKSwgCiAgICAgICAgICAgICAgICAgICAgbGFiZWwuc2l6ZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogICAgeGxpbSgtMS4xLCAxLjEpICsKICAgIHlsaW0oLTEuMSwgMS4xKSArCiAgICBnZ3RpdGxlKCJDcm9zc3dhbGsgb2YgR0VPLCBGQUlSLCBhbmQgVFJVU1QgcHJpbmNpcGxlcyIpICsKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQogIGdnc2F2ZShwYXN0ZSgiaW1hZ2VzL2NpcmN1bGFyXyIsInByaW5jaXBsZXMucG5nIiwgc2VwID0gIiIpLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxMiwgZHBpID0gNjAwKQoKYGBgCgoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiAgZ2dyYXBoKGdyYXBoKSArCiAgICBjb29yZF9maXhlZCgpICsKICAgIGdlb21fZWRnZV9saW5rMChhZXMoY29sb3IgPSBsaWZlY3ljbGUpLCB3aWR0aCA9IDEpICsKICAgIGdlb21fbm9kZV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3Ioc291cmNlKSksIHNpemUgPSAxLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgICBnZW9tX25vZGVfbGFiZWwoYWVzKGxhYmVsID0gc2hvcnRfbGFiZWwsIAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGFzLmZhY3Rvcihzb3VyY2UpKSwgCiAgICAgICAgICAgICAgICAgICAgbGFiZWwuc2l6ZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogICAgZ2d0aXRsZSgiQ3Jvc3N3YWxrIG9mIEdFTywgRkFJUiwgYW5kIFRSVVNUIHByaW5jaXBsZXMiKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkKICBnZ3NhdmUocGFzdGUoImltYWdlcy9hdXRvXyIsInByaW5jaXBsZXMucG5nIiwgc2VwID0gIiIpLCB3aWR0aCA9IDE4LCBoZWlnaHQgPSAxOCwgZHBpID0gNjAwKQpgYGAKCgpgYGB7ciwgZWNobz1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KI2dyYXBoIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZSgKIyAgZCA9IGVfZG1wX2xpZmVjeWNsZSwKIyAgdmVydGljZXMgPSBuX2FsbCwKIyAgZGlyZWN0ZWQgPSBGQUxTRSkKIwpgYGAKClxuZXdwYWdlCiMjIE5leHQgU3RlcHMKCldoaWxlIHRoZSBjdXJyZW50IHNwcmVhZHNoZWV0IHByb3ZpZGVzIGEgdXNlZnVsIGluaXRpYWwgcGxhdGZvcm0gZm9yIGNhcHR1cmluZyBhbmQgc2hhcmluZyB0aGUgaW5pdGlhbCBtYXBwaW5ncywgaXQgZG9lcyBub3QgcHJvdmlkZSBhIHNjYWxhYmxlIGRhdGEgc3RydWN0dXJlIHRoYXQgd2lsbCBlbmFibGUgc3RyZWFtbGluZWQgY29sbGVjdGlvbiBvZiBkYXRhIGZyb20gbXVsdGlwbGUgY29udHJpYnV0b3JzLCBhbGxvd2luZyBmb3IgY3Jvc3MtdmFsaWRhdGlvbiBvZiBpZGVudGlmaWVkIGNvbm5lY3Rpb25zLiBOZXh0IHN0ZXBzIGZvciB3b3JrIG9uIHRoaXMgcHJvamVjdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CgoqIFRyYW5zaXRpb25pbmcgdG8gYSBkYXRhIG1vZGVsIHRoYXQgd2lsbCBlbmFibGUgY2FwdHVyZSBhbmQgbWFuYWdlbWVudCBvZiBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGZyb20gbXVsdGlwbGUgY29udHJpYnV0b3JzIC0gZW5hYmxpbmcgY3Jvc3MgdmFsaWRhdGlvbiBvZiBpZGVudGlmaWVkIGNvbm5lY3Rpb25zLgoqIEV4cGFuc2lvbiBvZiB0aGUgZGF0YSBtb2RlbCB0byBjYXB0dXJlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuYXR1cmUgb2YgdGhlIGNvbm5lY3Rpb25zCiogRGV2ZWxvcCBhbiBvbmxpbmUgZGFzaGJvYXJkIHRoYXQgcHJvdmlkZXMgY3VycmVudCBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGJhc2VkIHVwb24gY29tbXVuaXR5IGNvbnRyaWJ1dGVkIGRhdGEKKiBQdWJsaXNoIHRoZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcyBpbiBvbmUgb3IgbW9yZSBFYXJ0aCBTY2llbmNlIGRhdGEgcHVibGljYXRpb24gdmVudWVzCgoKIyMgQXBwZW5kaXggQSAtIFJlZmVyZW5jZSBJbmZvcm1hdGlvbiBmb3IgdGhlIERhdGEgU2hhcmluZyBhbmQgRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMKClVuZGVyIGRldmVsb3BtZW50Cg==